package Genericity_etc.Exer.Set_etc;

import org.junit.Test;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * @author Jimmy Zhan WORKSTATION
 * @date 2023/3/21 18:57
 * 说明：TreeSet使用说明
 */

public class TreeSetTest {
    /**
     * 自然排序：String类
     */
    @Test
    public void test1(){
        TreeSet treeSet = new TreeSet();
        treeSet.add("AA");
        treeSet.add("BB");
        treeSet.add("MM");
        treeSet.add("GG");
        treeSet.add("SS");
        // 因为TreeSet底层实现为红黑树，要比较元素大小，因此要求所有送进TreeSet的对象必须使用相同的类型
        // treeSet.add(123);
        Iterator iterator = treeSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

    /**
     * 自然排序：自定义类
     * 实现Comparable接口，重写compareTo()方法
     */
    @Test
    public void test2() {
        TreeSet treeSet = new TreeSet();
        User u1 = new User("Jimmy", 24);
        User u2 = new User("Tom", 456);
        User u3 = new User("White", 29);
        // 如果User类中的compareTo()只比较年龄，则u4和u1年龄相同，会被判断为相同，u4则不会被添加进TreeSet
        // 原因是TreeSet底层使用红黑树结构
        User u4 = new User("Baron", 24);
        User u5 = new User("Jerry", 11);
        // 必须要实现Comparable类
        treeSet.add(u1);
        treeSet.add(u2);
        treeSet.add(u3);
        treeSet.add(u4);
        treeSet.add(u5);

        Iterator iterator = treeSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }


    /**
     * 定制排序
     * 实现Compare()方法
     * 姓名从小到大，性别从大到小
     */
    @Test
    public void test3() {
        Comparator comparator = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 == o2){
                    return 0;
                }
                if (o1 instanceof User && o2 instanceof User){
                    User u1 = (User) o1;
                    User u2 = (User) o2;
                    int value = u1.getName().compareTo(u2.getName());
                    if (value != 0){
                        return value;
                    }
                    return -(u1.getAge() - u2.getAge());
                }
                throw new RuntimeException("类型不匹配");
            }
        };


        TreeSet treeSet = new TreeSet();
        User u1 = new User("Jimmy", 24);
        User u2 = new User("Tom", 456);
        User u3 = new User("White", 29);
        // 如果User类中的compareTo()只比较年龄，则u4和u1年龄相同，会被判断为相同，u4则不会被添加进TreeSet
        // 原因是TreeSet底层使用红黑树结构
        User u4 = new User("Baron", 24);
        User u5 = new User("Jerry", 11);
        // 必须要实现Comparable类
        treeSet.add(u1);
        treeSet.add(u2);
        treeSet.add(u3);
        treeSet.add(u4);
        treeSet.add(u5);

        Iterator iterator = treeSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
